// 组合继承已经相对完善了，但还是存在问题，它的问题就是调用了 2 次父类构造函数，第一次是在 new Animal()，第二次是在 Animal.call() 这里。

// 所以解决方案就是不直接调用父类构造函数给子类原型赋值，而是通过创建空函数 F 获取父类原型的副本。

// 寄生式组合继承写法上和组合继承基本类似，区别是如下这里

function Animal (name) { // 父类构造函数
  this.name = name
  this.colors = ['red', 'blue']
}
Animal.prototype.getColor = function () { // 父类原型链属性
  return this.colors
}
function Dog (name, age) { // 子类构造函数
  Animal.call(this, name) // 借用构造函数
  this.age = age
}
Dog.prototype.nihao = function () { // 子类的原型
  console.log('你好');
}
// 相当于是让dog的prototype的__proto__指向了animal的prototype
Dog.prototype = Object.create(Animal.prototype) // 调用create方法 让子类的prototype的__proto__指向父类的prototype
Dog.prototype.constructor = Dog // 修改构造函数

let dog = new Dog('小黄', 3)
let color = dog.getColor()
console.log(color);
// dog.nihao()  这个会报错,因为已经修改了本来的原型链
